package cn.liangxxhu.rocketmq.toolkit;

import org.slf4j.MDC;

import java.util.UUID;

/**
 * 简单的 TraceId 工具类，基于 SLF4J MDC 传递链路追踪标识。
 * 日志中可通过 %X{traceId} 输出该标识，便于跨线程/跨组件排查问题。
 */
public class TraceIdUtil {

    /** MDC 中 traceId 的键名 */
    private static final String TRACE_ID_KEY = "traceId";

    /**
     * 生成新的 traceId。
     * @return UUID 字符串
     */
    public static String generateTraceId() {
        return UUID.randomUUID().toString();
    }

    /**
     * 写入 traceId 到 MDC；若入参为空则自动生成。
     * @param traceId 待写入的 traceId
     */
    public static void putTraceId(String traceId) {
        if (traceId == null || traceId.isEmpty()) {
            traceId = generateTraceId();
        }
        MDC.put(TRACE_ID_KEY, traceId);
    }

    /**
     * 从 MDC 获取当前 traceId。
     * @return 当前 traceId，可能为 null
     */
    public static String getTraceId() {
        return MDC.get(TRACE_ID_KEY);
    }

    /**
     * 从 MDC 移除 traceId，避免线程复用造成污染。
     */
    public static void clear() {
        MDC.remove(TRACE_ID_KEY);
    }
}
